package data;

import java.io.File;
import java.util.UUID;

import modele.Manga;
import modele.ObjetSimple;
import modele.Serie;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.persistence.FilePersistenceStrategy;
import com.thoughtworks.xstream.persistence.PersistenceStrategy;

import depot.DepotSimple;

/**
 * Initialise les données (factory)
 * @author phil
 */
public class Bd {
	/**
     * Constantes qui définissent les path pour les xml
     */
    protected final String ROOT_PATH = "bd/";
    protected final String GENRE_PATH = "genres/";
    protected final String AUTEUR_PATH = "auteurs/";
    protected final String EDITEUR_PATH = "editeurs/";
    protected final String COLLECTION_PATH = "collections/";
    protected final String TYPE_PATH = "types/";
    protected final String MAGAZINE_PATH = "magazines/";
    protected final String PAYS_PATH = "pays/";
    protected final String ILLUSTRATION_PATH = "illustrations/";
    protected final String STATUS_PATH = "status/";
    protected final String PERSONNE_PATH = "personnes/";
    protected final String MANGA_PATH = "mangas/";
    protected final String SERIE_PATH = "series/";
    protected final String IMAGES_PATH = "images/";
    
    /**
     * Hashmap des genres
     */
    protected DepotSimple<ObjetSimple> genres;
    
    /**
     * Hashmap des auteurs
     */
    protected DepotSimple<ObjetSimple> auteurs;
    
    /**
     * Hashmap des éditeurs
     */
    protected DepotSimple<ObjetSimple> editeurs;
    
    /**
     * Hashmap des collections
     */
    protected DepotSimple<ObjetSimple> collections;
    
    /**
     * Hashmap des types
     */
    protected DepotSimple<ObjetSimple> types;
    
    /**
     * Hashmap des magazines
     */
    protected DepotSimple<ObjetSimple> magazines;
    
    /**
     * Hashmap des pays
     */
    protected DepotSimple<ObjetSimple> pays;
    
    /**
     * Hashmap des illustrations
     */
    protected DepotSimple<ObjetSimple> illustrations;
    
    /**
     * Hashmap des status
     */
    protected DepotSimple<ObjetSimple> status;
    
    /**
     * Hashmap des personnes
     */
    protected DepotSimple<ObjetSimple> personnes;
    
    /**
     * Hashmap des mangas
     */
    protected DepotSimple<Manga> mangas;
    
    /**
     * Hashmap des mangas
     */
    protected DepotSimple<Serie> series;
    
    /**
     * Constructeur, instancie les maps
     */
    public Bd() {
        // Créer les dossiers
        File root = new File(this.ROOT_PATH);
        root.mkdir();
        File genreFile = new File(this.ROOT_PATH + this.GENRE_PATH);
        genreFile.mkdir();
        File auteurFile = new File(this.ROOT_PATH + this.AUTEUR_PATH);
        auteurFile.mkdir();
        File editeurFile = new File(this.ROOT_PATH + this.EDITEUR_PATH);
        editeurFile.mkdir();
        File collectionFile = new File(this.ROOT_PATH + this.COLLECTION_PATH);
        collectionFile.mkdir();
        File typeFile = new File(this.ROOT_PATH + this.TYPE_PATH);
        typeFile.mkdir();
        File magazineFile = new File(this.ROOT_PATH + this.MAGAZINE_PATH);
        magazineFile.mkdir();
        File paysFile = new File(this.ROOT_PATH + this.PAYS_PATH);
        paysFile.mkdir();
        File illustrationFile = new File(this.ROOT_PATH + this.ILLUSTRATION_PATH);
        illustrationFile.mkdir();
        File statusFile = new File(this.ROOT_PATH + this.STATUS_PATH);
        statusFile.mkdir();
        File personneFile = new File(this.ROOT_PATH + this.PERSONNE_PATH);
        personneFile.mkdir();
        File imagesFile = new File(this.ROOT_PATH + this.IMAGES_PATH);
        imagesFile.mkdir();
        File mangaFile = new File(this.ROOT_PATH + this.MANGA_PATH);
        mangaFile.mkdir();
        File serieFile = new File(this.ROOT_PATH + this.SERIE_PATH);
        serieFile.mkdir();
        
        XStream x = new XStream(new DomDriver());
        x.registerConverter(new BaseConverter());
        x.registerConverter(new MangaConverter());
        x.registerConverter(new SerieConverter(this));
        
        PersistenceStrategy genreStrategy = new FilePersistenceStrategy(genreFile, x);
        PersistenceStrategy auteurStrategy = new FilePersistenceStrategy(auteurFile, x);
        PersistenceStrategy editeurStrategy = new FilePersistenceStrategy(editeurFile, x);
        PersistenceStrategy collectionStrategy = new FilePersistenceStrategy(collectionFile, x);
        PersistenceStrategy typeStrategy = new FilePersistenceStrategy(typeFile, x);
        PersistenceStrategy magazineStrategy = new FilePersistenceStrategy(magazineFile, x);
        PersistenceStrategy paysStrategy = new FilePersistenceStrategy(paysFile, x);
        PersistenceStrategy illustrationStrategy = new FilePersistenceStrategy(illustrationFile, x);
        PersistenceStrategy statusStrategy = new FilePersistenceStrategy(statusFile, x);
        PersistenceStrategy personneStrategy = new FilePersistenceStrategy(personneFile, x);
        PersistenceStrategy mangaStrategy = new FilePersistenceStrategy(mangaFile, x);
        PersistenceStrategy serieStrategy = new FilePersistenceStrategy(serieFile, x);
        
        genres = new DepotSimple<ObjetSimple>(genreStrategy, "Genre", "Genres");
        auteurs = new DepotSimple<ObjetSimple>(auteurStrategy, "Auteurs", "Auteur");
        editeurs = new DepotSimple<ObjetSimple>(editeurStrategy, "Éditeurs", "Éditeur");
        collections = new DepotSimple<ObjetSimple>(collectionStrategy, "Collections", "Collection");
        types = new DepotSimple<ObjetSimple>(typeStrategy, "Types", "Type");
        magazines = new DepotSimple<ObjetSimple>(magazineStrategy, "Magazines", "Magazine");
        pays = new DepotSimple<ObjetSimple>(paysStrategy, "Pays", "Pays");
        illustrations = new DepotSimple<ObjetSimple>(illustrationStrategy, "Illustrations", "Illustration");
        status = new DepotSimple<ObjetSimple>(statusStrategy, "Status", "Status");
        personnes = new DepotSimple<ObjetSimple>(personneStrategy, "Personnes", "Personne");
        mangas = new DepotSimple<Manga>(mangaStrategy, "Mangas", "Manga");
        series = new DepotSimple<Serie>(serieStrategy, "Séries", "Série");
        
        if (genres.count() == 0) genres.add(new ObjetSimple(UUID.randomUUID(), ""));
        if (auteurs.count() == 0) auteurs.add(new ObjetSimple(UUID.randomUUID(), ""));
        if (editeurs.count() == 0) editeurs.add(new ObjetSimple(UUID.randomUUID(), ""));
        if (collections.count() == 0) collections.add(new ObjetSimple(UUID.randomUUID(), ""));
        if (types.count() == 0) types.add(new ObjetSimple(UUID.randomUUID(), ""));
        if (magazines.count() == 0) magazines.add(new ObjetSimple(UUID.randomUUID(), ""));
        if (pays.count() == 0) pays.add(new ObjetSimple(UUID.randomUUID(), ""));
        if (illustrations.count() == 0) illustrations.add(new ObjetSimple(UUID.randomUUID(), ""));
        if (status.count() == 0) status.add(new ObjetSimple(UUID.randomUUID(), ""));
        if (personnes.count() == 0) personnes.add(new ObjetSimple(UUID.randomUUID(), ""));
        // Don't insert empty manga, it's useless
        // Don't insert empty serie, it's useless
    }
    
    /**
     * Getter pour le dépot de genres
     * @return Le dépot de genres
     */
    public DepotSimple<ObjetSimple> getGenres() {
        return this.genres;
    }
    
    /**
     * Getter pour le dépot d'auteurs
     * @return Le dépot d'auteurs
     */
    public DepotSimple<ObjetSimple> getAuteurs() {
        return this.auteurs;
    }
    
    /**
     * Getter pour le dépot d'éditeurs
     * @return Le dépot d'éditeurs
     */
    public DepotSimple<ObjetSimple> getEditeurs() {
        return this.editeurs;
    }
    
    /**
     * Getter pour le dépot des collections
     * @return Le dépot des collections
     */
    public DepotSimple<ObjetSimple> getCollections() {
        return this.collections;
    }
    
    /**
     * Getter pour le dépot des types
     * @return Le dépot des types
     */
    public DepotSimple<ObjetSimple> getTypes() {
        return this.types;
    }
    
    /**
     * Getter pour le dépot des magazines
     * @return Le dépot des magazines
     */
    public DepotSimple<ObjetSimple> getMagazines() {
        return this.magazines;
    }
    
    /**
     * Getter pour le dépot des pays
     * @return Le dépot des pays
     */
    public DepotSimple<ObjetSimple> getPays() {
        return this.pays;
    }
    
    /**
     * Getter pour le dépot des illustrations
     * @return Le dépot des illustrations
     */
    public DepotSimple<ObjetSimple> getIllustrations() {
        return this.illustrations;
    }
    
    /**
     * Getter pour le dépot des status
     * @return Le dépot des status
     */
    public DepotSimple<ObjetSimple> getStatus() {
        return this.status;
    }
    
    /**
     * Getter pour le dépot des personnes
     * @return Le dépot des personnes
     */
    public DepotSimple<ObjetSimple> getPersonnes() {
        return this.personnes;
    }
    
    /**
     * Getter pour le dépot des mangas
     * @return Le dépot des mangas
     */
    public DepotSimple<Manga> getMangas() {
        return this.mangas;
    }
    
    /**
     * Getter pour le dépot des séries
     * @return Le dépot des séries
     */
    public DepotSimple<Serie> getSeries() {
        return this.series;
    }
}
